package com.rdc.example.util;

import com.rdc.example.bean.Result;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.UUID;

public class FileUtil {

    /**
     * 删除文件
     * @param filePath 文件绝相对路径
     * @return
     * @throws IOException
     */
    public  static boolean  deleteFile(String filePath) throws IOException {
        /*数据库中相对路径（filePath）：
            audio/12d30010-810c-466a-bd5d-96dc05720e07.m4a
        或者是imgs/63504313-3c96-496a-bdee-114afa1493c3.png
        "D:\\IdeaProjects\\lijialaing_Cloudmusic\\src\\main\\webapp\\imgs\\uuid.png"*/
        filePath = "D:\\IdeaProjects\\lijialaing_Cloudmusic\\src\\main\\webapp\\"+filePath;
        Path path= Paths.get(filePath);
        return Files.deleteIfExists(path);
    }

//    public static void main(String[] args) throws IOException {
//        System.out.println( deleteFile("imgs\\a.jsp"));
//    }


    /**
     *
     * @param fileItems
     * @param type   //0 图片 ，1 音频
     * @return  result  //(y/n,msg,path (likeimgs/pic.png))
     * @throws IOException
     */
    public static Result uploadFile(List<FileItem> fileItems,Integer type) throws IOException {
        boolean hasFile = false;
        //检查是否有文件
        for (FileItem item :  fileItems) {
            if (!item.isFormField()) {
                // 检查是否有文件字段
                hasFile = true;
                break;
            }
        }
        if (!hasFile) {
            return Result.fail("未上传文件",null);
        }
        for (FileItem fileItem : fileItems) {
//            判断是否为普通字段
            if (fileItem.isFormField()) {
//                    获取字段名称
            } else {
                //获取上传的文件名
                String filename = fileItem.getName();
//                    处理上传文件
                if (filename != null && filename != "") {
                    //获取文件格式
                    String fileExtension = filename.substring(filename.lastIndexOf('.') + 1);
                    System.out.println("上传的文件名称是：" + filename + "格式为：" + fileExtension);
                    //检验文件是否符合对应格式，不是的打回
                    boolean isAllowed = false;
                    if (type==0) {
                        String[] format={"jpg","jpeg","png","gif","bmp"};
                        isAllowed = false;
                        for (String allowedFormat : format) {
                            if (allowedFormat.equalsIgnoreCase(fileExtension)) {
                                isAllowed = true;
                                break;
                            }
                        }
                    }else if (type==1) {
                        String[] format={"m4a","mp3"};
                        isAllowed = false;
                        for (String allowedFormat : format) {
                            if (allowedFormat.equalsIgnoreCase(fileExtension)) {
                                isAllowed = true;
                                break;
                            }
                        }
                    }
                    if (!isAllowed) {
                        return Result.fail("文件格式错误",null);
                    }
                    String absolutePath=new String();
                    if(type==0){
                        absolutePath="D:\\IdeaProjects\\lijialaing_Cloudmusic\\src\\main\\webapp\\imgs\\";
                    }if(type==1){
                        absolutePath="D:\\IdeaProjects\\lijialaing_Cloudmusic\\src\\main\\webapp\\audio\\";
                    }

                    //UUID+格式保持文件名唯一
                    filename = UUID.randomUUID().toString() + "." + fileExtension;
                    String filepath = absolutePath + filename;
                    //System.out.println("filepath:" + filepath);
                    //创建File对象
                    File file = new File(filepath);
                    //创建文件夹
                    file.getParentFile().mkdirs();
                    //创建文件
                    file.createNewFile();
                    //获取上传文件流
                    InputStream in = fileItem.getInputStream();
                    //使用 FileOutputStream打开服务器端的上传文件
                    FileOutputStream out = new FileOutputStream(file);
                    //流的对拷
                    // 每次读取一个字节
                    byte[] bytes = new byte[1024];
                    int len;
                    //开始读取上传文件的字节，并将其输出到服务器端的上传文件输出流中
                    while ((len = in.read(bytes)) > 0) {
                        out.write(bytes, 0, len);
                    }
                    in.close();
                    out.close();
                    fileItem.delete();
                    String url=new String();
                    //url为文件类型对应web下面的包+文件名，读出来可以直接用
                    if (type==0) {
                        url="imgs/"+filename;
                    }else if (type==1) {
                        url="audio/"+filename;
                    }
                    return Result.success("文件上传成功！",url);
                }
            }

        }
        return Result.fail("上传失败",null);
    }

    public static String uploadImg(List<FileItem> fileItems) throws IOException {
        for (FileItem fileItem : fileItems) {
//            判断是否为普通字段
            if (fileItem.isFormField()) {
//                    获取字段名称
            } else {
                //获取上传的文件名
                String filename = fileItem.getName();
//                    处理上传文件
                if (filename != null && filename != "") {
                    //获取文件格式
                    String fileExtension = filename.substring(filename.lastIndexOf('.') + 1);
                    System.out.println("上传的文件名称是：" + filename + "格式为：" + fileExtension);
                    //检验文件是否符合对应格式，不是的打回
                        String[] format={"jpg","jpeg","png","gif","bmp"};
                    boolean isAllowed = false;
                        for (String allowedFormat : format) {
                            if (allowedFormat.equalsIgnoreCase(fileExtension)) {
                                isAllowed = true;
                                break;
                            }
                        }
                    if (!isAllowed) {
                        return null;
                    }
                    //设置绝对路径
                    String absolutePath="D:\\IdeaProjects\\lijialaing_Cloudmusic\\src\\main\\webapp\\imgs\\";
                    //UUID+格式保持文件名唯一
                    filename = UUID.randomUUID().toString() + "." + fileExtension;
                    String filepath = absolutePath + filename;
                    //System.out.println("filepath:" + filepath);
                    //创建File对象
                    File file = new File(filepath);
                    //创建文件夹
                    file.getParentFile().mkdirs();
                    //创建文件
                    file.createNewFile();
                    //获取上传文件流
                    InputStream in = fileItem.getInputStream();
                    //使用 FileOutputStream打开服务器端的上传文件
                    FileOutputStream out = new FileOutputStream(file);
                    //流的对拷
                    // 每次读取一个字节
                    byte[] bytes = new byte[1024];
                    int len;
                    //开始读取上传文件的字节，并将其输出到服务器端的上传文件输出流中
                    while ((len = in.read(bytes)) > 0) {
                        out.write(bytes, 0, len);
                    }
                    in.close();
                    out.close();
                    fileItem.delete();
                    //返回文件类型对应web下面的包+文件名，读出来可以直接用
                    return "imgs/"+filename;
                }
            }
        }
        return null;
    }
}